from psycopg2 import psycopg1 as pg
class Coneccion:
	"""
		Esta clase brindara todo lo necesario para realizar las conecciones a la BD,
		ejecutar las consultas, los comandos,... etc
		NOTA: Como esta estructurado hasta ahora solo va a permitir tansacciones siempre dentro de la misma entidad.
		no nos va a permitir insertar en personas y en provincias a la vez por ejemplo
		no seria una transaccion que estaria controlada.
		Pero si nos va a permitir una transaccion si solo grabamos utilizando metodos de la clase personas.
	"""
	def __init__(self, strConexion=None):
		#se recibe un strConexion que indicaria a que servidor y que base nos estariamos conectando.
		"""
			Esta parte la utilizamos para definir todos los atributos de una clase.
			Tambien los podemos inicializar.
			Si el nombre comienza con dos guiones bajos se trata de un atributo privado,
			caso contreario es un atributo publico.
			Ver como si existen los atributos protected de otros lenguages.
		"""
		if (strConexion==None):
			#Esta cadena de conexion no tendria que estar aca.....
			#En cambio tendria que estar en algun archivo de configuracion. 
			self.__strconexion = "host=localhost user=postgres dbname=graduados password=hwxn440"
		else:
			self.__strconexion = strConexion
		self.__oCon = pg.connect(self.__strconexion)
		self._objDic = None
		self.__oTran = None		#se va a utilizar para almacenar las transacciones. 

#Region "Atributos"
	@apply
	def cadenaconeccion():
		def fget(self):
			return self.__strconexion 
		def fset(self):
			self.__strconexion = cadenaconeccion
		return property(**locals())

	@apply
	def diccionario():
		def fget(self):
			return self._objDic
		def fset(self):
			self._objDic = diccionario
		return property(**locals())

	@apply
	def con():
		def fget(self):
			return self.__oCon 
		def fset(self):
			self.__oCon = con
		return property(**locals())

#Fin Region de Atributos. 

	def EjecutarConsulta(self, strSQL):
		"""
			Esta funcion se va a encargar de recibir una consulta en el parametro strSQL
			y se ejecutarla para llenar el DICCIONARIO que recibira por referencia del llamador.
			Esta funcion tambien tendria que retornar true or false de acuerdo al exito a fracaso de la operacion.
		"""
		exito =  True 
		try:
			#If Not (oCon.State = ConnectionState.Open) Then
			#    oCon.Open()
			#End If
			crs = self.__oCon.cursor()
			crs.execute(strSQL)
			self._objDic = dict()
			self._objDic = crs.dictfetchall()
			"""
				Ver de utilizar estas clases que se encuentran en el archivo
				extras de psycopg para obtener directamente el resultado de una 
				consulta dentro de un diccionario.
				class DictConnection(_connection):
					A connection that uses DictCursor automatically.
					def cursor(self):
					return _connection.cursor(self, cursor_factory=DictCursor)
				class DictCursor(_cursor):
					 A cursor that keeps a list of column name -> index mappings.
			"""
		except:
			exito = False
	        strError = "Problemas al querer ejecutar una consulta. "
		"""
		finally
			self.__oCon.close()
			Esto lo saque porque en primer lugar no tendria que haber una consulta 
			dentro de una transaccion, y por otro lado, hay que ver si no le tendriamos
			que sacar el autocomit.
			If Not EnTransaccion() Then
				If oCon.State = ConnectionState.Open Then
					oCon.Close()
				End If
			End If
			"""
		return exito
	
"""
	
	    Public Function ejecutarComando(ByVal strSQL As String, Optional ByRef strError As String = "") As Boolean
	        'Dim oConexion As New MySqlConnection
	
	        'Dim oConexion As New NpgsqlConnection
	        Dim exito As Boolean = True
	        Try
	            'oConexion.ConnectionString = CONEXION
	            '' crear adaptador
	            ''Dim oda As New MySqlDataAdapter(strSQL, oConexion)
	            'oConexion.Open()
	            'creo la conexion
	            If Not (oCon.State = ConnectionState.Open) Then
	                oCon.Open()
	            End If
	            '
	            'Dim oCmd As New MySqlCommand(strSQL, oConexion)
	
	            'Dim oCmd As New NpgsqlCommand(strSQL, oConexion)
	            Dim oCmd As New NpgsqlCommand(strSQL, oCon)
	            oCmd.ExecuteNonQuery()
	
	            'SqlCommandBuilder.DeriveParameters(oCmd)
	            ' utilizar el adaptador para llenar el dataset con una tabla
	        Catch e As DataException
	            exito = False
	            strError = "Problemas al querer ejecutar un comando. " & e.Message
	            'MsgBox("Problemas al querer ejecutar un comando. Comuniquese con el dpto de sistemas.")
	        Finally
	            If Not EnTransaccion() Then
	                If oCon.State = ConnectionState.Open Then
	                    oCon.Close()
	                End If
	            End If
	        End Try
	        Return exito
	    End Function
	
	    Public Function EnTransaccion() As Boolean
	        Return Not (oTran Is Nothing)
	    End Function
	
	    Public Function BeginTran() As Boolean
	        Dim exito As Boolean
	        exito = True
	        Try
	            oCon.Open()
	            oTran = oCon.BeginTransaction()
	        Catch
	            exito = False
	        End Try
	        Return exito
	    End Function
	
	    Public Function Commit() As Boolean
	        Dim exito As Boolean = True
	        Try
	            If EnTransaccion() Then
	                oTran.Commit()
	                oTran = Nothing
	                oCon.Close()
	            Else
	                Throw New ApplicationException("Commit sin Tansaccion")
	            End If
	        Catch
	            exito = False
	        End Try
	        Return exito
	    End Function
	
	    Public Function RollBack() As Boolean
	        Dim exito As Boolean
	        exito = True
	        Try
	            If EnTransaccion() Then
	                oTran.Rollback()
	                oTran = Nothing
	                oCon.Close()
	            Else
	                'ver esto, puede que este mal
	                Throw New ApplicationException("RollBack sin Transaccion")
	            End If
	        Catch
	            exito = False
	        End Try
	        Return exito
	    End Function
"""